require('mysql')
var fs = require('fs')
var orm = require('orm')
var Promise = require('bluebird')
var path = require('path')

/*
	app: 应用程序环境
	config: 数据库配置
	callback: 回调
*/
function initialize (app, callback) {

  // 加载配置文件
  var config = require('config').get('db_config')

  // 从配置中获取数据库配置
  var opts = {
    protocol: config.get('protocol'),
    host: config.get('host'),
    database: config.get('database'),
    port: config.get('port'),
    user: config.get('user'),
    password: config.get('password'),
    query: { pool: true, debug: true }
  }

  console.log('数据库连接参数 %s', JSON.stringify(opts))

  // 初始化ORM模型
  app.use(orm.express(opts, {
    define: function (db, models, next) {

      app.db = db
      global.database = db

      // 获取映射文件路径
      var modelsPath = path.join(process.cwd(), '/models')

      // 读取所有模型文件
      fs.readdir(modelsPath, function (err, files) {
        // 存放所有的加载模型函数
        var loadModelAsynFns = new Array()
        // console.log("开始加载 ORM 模型层文件 ");
        for (var i = 0; i < files.length; i++) {
          var modelPath = modelsPath + '/' + files[i]
          // console.log("加载模型 %s",modelPath);
          loadModelAsynFns[i] = db.loadAsync(modelPath)
        }

        Promise.all(loadModelAsynFns).then(function () {
          // console.log("ORM 模型加载完成");
          // 挂载模型集合

          for (var modelName in db.models) {
            models[modelName] = db.models[modelName]
          }
          app.models = models
          callback(null)
          next()
        }).catch(function (error) {
          console.error('加载模块出错 error: ' + err)
          callback(error)
          next()
        })
      })
    }
  }))
}

module.exports.initialize = initialize
module.exports.getDatabase = function () {
  return global.database
}